#做出界面，来功能写好:
# 1.调用一个模块去跟我的文本文档中的文字去匹配 匹配度:
# #2.在跟我设定的这个匹配度对比，展示结果

'''
问题：
自己写代码之后出现的问题就是查询功能还没实现
'''
import sys
from PyQt5.QtGui import *  # 包含用于处理图形和基本图形功能的类
from PyQt5.QtWidgets import *  # 包含各种用于创建CI控件的类
from fuzzywuzzy import fuzz  # 的模糊匹配，fuzz模块提供了多种模糊匹配函数


'''用面向对象，类来实现这个程序'''
class GUI(QWidget):
    # 定义构造函数
    def __init__(self, parent=None):
        super().__init__()
        # 设置窗口的标题
        self.setWindowTitle('名人名言查询系统')
        # 设置窗口的图标
        #self.setWindowIcon(r'C:\Users\13368595675\PycharmProjects\mianshi_project01\javascript\day22_GUI实现鲁迅名言查询小系统\data\luxun.jpg')
        # 创建各种组件
        # 句子
        self.label1 = QLabel('句子：')
        # 输入框
        self.line_edit = QLineEdit()
        # 查询结果
        self.label2 = QLabel('查询结果：')
        # 展示结果区域
        self.text = QTextEdit()
        # 创建提交按钮--查询
        self.button = QPushButton('查询')
        # 创建一个下拉选择框--匹配度
        self.cmb = QComboBox()
        # 选择框样式设置
        self.cmb.setStyle(QStyleFactory.create('Windows'))
        # 往选择框中添加四个选项
        self.cmb.addItem('匹配度:  100%')
        self.cmb.addItem('匹配度:  90%')
        self.cmb.addItem('匹配度:  80%')
        self.cmb.addItem('匹配度:  70%')
        # 接下来进行布局
        # 创建网格布局管理器
        self.grid = QGridLayout()
        # 设置每个组件之间的间距
        self.grid.setSpacing(12)
        # 将这些组件添加到网格布局中
        # 第二行第一列
        self.grid.addWidget(self.label1, 1, 0)
        # 第行的第二列，阔以行的第三十八列
        self.grid.addWidget(self.line_edit, 1, 1, 1, 38)
        self.grid.addWidget(self.button, 1, 39)
        self.grid.addWidget(self.label2, 2, 0)
        self.grid.addWidget(self.text, 2, 1, 1, 40)
        self.grid.addWidget(self.cmb, 1, 40)
        # 把网格布局设置为窗口的布局
        self.setLayout(self.grid)
        # 设置窗口的初始大小
        self.resize(600, 400)
        # 查询按钮button连接一个查询方法
        self.button.clicked.connect(self.inquiry)
        # 数据(从文本中加载数据)
        self.paragraphs = self.loadData(r'C:\Users\13368595675\PycharmProjects\mianshi_project01\javascript\day22_GUI实现鲁迅名言查询小系统\data\book.txt')
    '''查询功能     你输入的句子跟文本当中的文字做匹配'''
    def inquiry(self):
        # 拿到这个你输入的文本
        sentence = self.line_edt.text()
        # 定义列表保存匹配的句子
        matched = []
        # 拿到匹配度的匹配度
        score_thresh = self.getScoreThreash()
        # 判断用户是否输入句子
        if not sentence:
            # 警告
            QMessageBox.warning(self, 'warning', '请输入需要查询的名言')
        else:
            # 遍历整个文本数据
            for p in self.paragraphs:
                # 计算输入的句子跟文本的句子匹配度--得到的是一个数值
                score = fuzz.partial_ratio(p, sentence)
                # 做判断
                if score >= score_thresh and len(sentence) <= len(p):
                    # 存储到列表中去
                    matched.append([score, p])
            # 规范匹配上的结果
            infos = []
            # 遍历刚刚得到的结果
            for match in matched:
                infos.append(f"[匹配度]：{match[0]}\n [内容]：{match[1]}\n")
            # 若果没有匹配的句子，给个提示
            if not infos:
                infos.append(f"未匹配到任何相似度大于{score_thresh}的句子\n")
            # 将所有文本的句子显示在文本框  列表便字符串
            self.text.setText('\n\n\n'.join(infos))


    '''根据你选择的这个匹配选项来获取你的匹配度'''
    def getScoreThreash(self):
        # 根据你选择这个选项的索引来判断你选择的选项
        # currentIndex():
        # 做判断
        if self.cmb.curentIndex() == 0:
            return 100
        elif self.cmb.curretIndex() == 1:
            return 90
        elif self.cmb.currentIndex() == 2:
            return 80
        elif self.cmb.currentIndex() == 3:
            return 70

    # 把数据导入
    def loadData(self, data_path):
        # 用列表存一下
        paragraphs = []
        # 读取文件
        with open(data_path, 'r', encoding='utf-8') as f:
            for line in f.readlines():  # readlines() 返回的是一个列表的形式  read() 返回的是一个字符串
                # 去空值--strip()--判断是不是空的值
                if line.strip():
                    paragraphs.append(line.strip('\n'))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = GUI()
    gui.show()
    sys.exit(app.exec_())


